home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Tool Chest / Dev.CD Feb 97 TC.toast / Sample Code / Interapplication Communication / MenuScripter 4.0 / Sources / MSAERevert.c < prev    next >
Encoding:
Text File  |  1996-07-09  |  3.7 KB  |  161 lines  |  [TEXT/CWIE]

  1. // MSAERevert.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. #include "MSAERevert.h"
  8.  
  9. #include "MSWindow.h"        // for DPtrFromWindowPtr()
  10. #include "MSFile.h"
  11.  
  12. #include "MSAEUtils.h"
  13. #include "MSAETextUtils.h"
  14. #include "MSAccessors.h"
  15. #include "MSAEDelete.h"
  16. #include "MSAEWindowUtils.h"
  17.  
  18. #pragma segment File
  19.  
  20.  
  21. // -----------------------------------------------------------------------
  22. //    Name:         DoRevert
  23. //    Purpose:    Handles the Revert AppleEvent.
  24. // -----------------------------------------------------------------------
  25.  
  26. pascal OSErr DoRevert(const AppleEvent    *theAppleEvent,
  27.                             AppleEvent     *reply,
  28.                             long        handlerRefCon)
  29. #ifdef __MWERKS__
  30.     #pragma unused (reply, handlerRefCon)
  31. #endif
  32.  
  33.     AEDesc            directObj = {typeNull, NULL};
  34.     WindowToken        aWindowToken;
  35.     OSErr            err;
  36.     
  37.         // pick up the direct object
  38.     err = AEGetParamDesc(theAppleEvent,  keyDirectObject, typeWildCard, &directObj);
  39.     
  40.     err = GotRequiredParams(theAppleEvent);
  41.     if (noErr != err) goto done;
  42.     
  43.     if (typeNull != directObj.descriptorType)
  44.         err = RevertDesc(&directObj);
  45.     else if ( GetNthDocument( 1 ) )                // If no direct object given, default
  46.     {                                            // to the front document.
  47.         aWindowToken.tokenWindow = GetNthDocument( 1 );
  48.         err = RevertDocumentToken( &aWindowToken );
  49.     }
  50.     else
  51.         err = errAENoSuchObject;
  52.         
  53. done:
  54.     (void)AEDisposeDesc(&directObj);
  55.         
  56.     return(err);
  57. } // DoRevertWindow
  58.  
  59.  
  60. OSErr     RevertDocumentToken(WindowToken* theToken)
  61. {
  62.     DPtr            docPtr;
  63.     TextToken        aTextToken;
  64.     OSErr            err;
  65.     
  66.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  67.     
  68.     if (! docPtr)
  69.         return errAEWrongDataType;
  70.  
  71.                         // Get a token for all the text in the window
  72.     err = TextTokenFromDocumentToken(theToken, &aTextToken);
  73.     if (noErr != err) goto done;
  74.                         // Delete all the text
  75.     err = DeleteTextToken(&aTextToken);
  76.     if (noErr != err) goto done;
  77.  
  78.     if (docPtr->everSaved) 
  79.     {
  80.         err = GetFileContents(docPtr->theFSSpec, docPtr);
  81.         if (noErr != err) goto done;
  82.  
  83.         ResizeWindow(docPtr);
  84.         docPtr->dirty = false;
  85.     }
  86.  
  87.     DoUpdate(docPtr->theWindow);
  88.  
  89. done:
  90.     return(err);
  91. }
  92.  
  93.  
  94. OSErr    RevertDocumentDesc(AEDesc* windowDesc)
  95. {
  96.     WindowToken        aWindowToken;
  97.     Size            actualSize;
  98.     OSErr            err;
  99.  
  100.     if (typeMyDocument != windowDesc->descriptorType)
  101.         return(errAETypeError);
  102.         
  103.     GetRawDataFromDescriptor(windowDesc, (Ptr)&aWindowToken, sizeof(aWindowToken), &actualSize);
  104.  
  105.     err = RevertDocumentToken(&aWindowToken);
  106.     
  107.     return(err);
  108. }
  109.  
  110.  
  111. OSErr    RevertDesc(AEDesc* aDesc)
  112. {
  113.     AEDesc        revertDesc = { typeNull, NULL },
  114.                 windowDesc = { typeNull, NULL },
  115.                 itemDesc = { typeNull, NULL };
  116.     long        itemCount,
  117.                 index;
  118.     DescType    theAEKeyword;
  119.     OSErr        err;
  120.     
  121.     if ( typeObjectSpecifier == aDesc->descriptorType )
  122.         err = AEResolve( aDesc, kAEIDoMinimum, &revertDesc );
  123.     else if ( typeNull != aDesc->descriptorType )
  124.         err = AEDuplicateDesc( aDesc, &revertDesc );
  125.         
  126.     if ( noErr != err ) goto done;
  127.     
  128.     switch ( revertDesc.descriptorType )
  129.     {
  130.         case typeAEList:
  131.             err = AECountItems( &revertDesc, &itemCount );
  132.             if ( noErr != err ) goto done;
  133.             
  134.             for ( index = 1; index <= itemCount; index++ )    // Do front back order
  135.             {
  136.                 err = AEGetNthDesc( &revertDesc, index, typeWildCard,
  137.                                                 &theAEKeyword, &itemDesc );
  138.                 if ( noErr != err ) goto done;
  139.                 
  140.                 err = RevertDesc( &itemDesc );    // Call recursively
  141.                 if (noErr != err) goto done;
  142.  
  143.                 (void)AEDisposeDesc( &itemDesc );
  144.             }
  145.             break;
  146.             
  147.         default:
  148.             err = AECoerceDesc( &revertDesc, typeMyDocument, &windowDesc );
  149.             if ( noErr != err ) goto done;
  150.             err = RevertDocumentDesc( &windowDesc );
  151.     }
  152.     
  153. done:
  154.     (void)AEDisposeDesc( &revertDesc );
  155.     (void)AEDisposeDesc( &windowDesc );
  156.     (void)AEDisposeDesc( &itemDesc );
  157.     
  158.     return err;
  159. }
  160.